package com.zhu.classpath.entry.factory;

import com.zhu.classpath.entry.base.DirEntry;
import com.zhu.classpath.entry.base.Entry;
import com.zhu.classpath.entry.base.JarEntry;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * Entry 工厂：根据路径字符串自动创建对应的 Entry 实现
 */
public class EntryFactory {

    public static List<Entry> createEntrys(String path) {
        List<Entry> entries = new ArrayList<>();
        if (path == null || path.isEmpty()){
            return entries;
        }
        path = path.trim();
        // 1. 通配符路径：xxx/*
        //JVM 的 /* 本意就是只匹配 JAR！ 这是官方解释 如java -cp "lib/*" MyApp  “把 lib/ 目录下的所有 JAR 文件 都加入类路径。”
        if (path.endsWith("/*")) {
            //  截掉/*
            String basePath = path.substring(0, path.length() - 2);
            File dir = new File(basePath);
            // 检查目录是否存在且是目录
            if (!dir.exists() || !dir.isDirectory()) {
                System.err.println("Warning: Path is not a valid directory: " + basePath);
                // 返回空列表
                return entries;
            }
            // 列出所有以 .jar 结尾的文件（不区分大小写）
            File[] jarFiles = dir.listFiles((File file) -> {
                String name = file.getName().toLowerCase();
                return name.endsWith(".jar") && file.isFile();
            });
            if (jarFiles == null) {
                // 空目录或权限问题
                return entries;
            }
            // 为每个 JAR 文件创建 JarEntry
            for (File jarFile : jarFiles) {
                try {
                    //jarFile.getAbsolutePath()	"C:\\my-project\\lib\\guava.jar"
                    entries.add(JarEntry.createJarEntry(jarFile.getAbsolutePath()));
                } catch (Exception e) {
                    System.err.println("Warning: Cannot create JarEntry for " + jarFile.getAbsolutePath() + ": " + e.getMessage());
                    // 继续处理其他文件
                }
            }
            return entries;
        }

        // 2. JAR 文件：以 .jar, .zip, .JAR, .ZIP 结尾
        if (isJarPath(path)) {
            try {
                 entries.add(JarEntry.createJarEntry(path));
                 return entries;
            } catch (Exception e) {
                System.err.println("Cannot open JAR: " + path);
                return null;
            }
        }else {
            // 3. 其他情况：视为目录
            entries.add(DirEntry.createDirEntry(path));
            return entries;
        }
    }

    private static boolean isJarPath(String path) {
        if (path == null || path.isEmpty()) return false;
        String lowerPath = path.toLowerCase();
        return lowerPath.endsWith(".jar") || lowerPath.endsWith(".zip");
    }
}
